package service

import (
	"context"
	"errors"
	"fmt"
	"gitee.com/chunanyong/zorm"
	"gitee.com/xls-web/zorm-gen/test/code/structs"
)

// SaveCreditCardsStruct 保存
// 如果入参ctx中没有dbConnection,使用defaultDao开启事务并最后提交
// 如果入参ctx有dbConnection且没有事务,调用dbConnection.begin()开启事务并最后提交
// 如果入参ctx有dbConnection且有事务,只使用不提交,有开启方提交事务
// 但是如果遇到错误或者异常,虽然不是事务的开启方,也会回滚事务,让事务尽早回滚
func SaveCreditCardsStruct(ctx context.Context, creditcardsstruct *structs.CreditCardsStruct) error {

	// creditcardsstruct对象指针不能为空
	if creditcardsstruct == nil {
		return errors.New("creditcardsstruct对象指针不能为空")
	}
	//匿名函数return的error如果不为nil,事务就会回滚
	_, errSaveCreditCardsStruct := zorm.Transaction(ctx, func(ctx context.Context) (interface{}, error) {

		//事务下的业务代码开始

		_, errSaveCreditCardsStruct := zorm.Insert(ctx, creditcardsstruct)

		if errSaveCreditCardsStruct != nil {
			return nil, errSaveCreditCardsStruct
		}

		return nil, nil
		//事务下的业务代码结束

	})

	//记录错误
	if errSaveCreditCardsStruct != nil {
		errSaveCreditCardsStruct := fmt.Errorf("service.SaveCreditCardsStruct错误:%w", errSaveCreditCardsStruct)
		fmt.Println(errSaveCreditCardsStruct)
		return errSaveCreditCardsStruct
	}

	return nil
}

// UpdateCreditCardsStruct 更新
// 如果入参ctx中没有dbConnection,使用defaultDao开启事务并最后提交
// 如果入参ctx有dbConnection且没有事务,调用dbConnection.begin()开启事务并最后提交
// 如果入参ctx有dbConnection且有事务,只使用不提交,有开启方提交事务
// 但是如果遇到错误或者异常,虽然不是事务的开启方,也会回滚事务,让事务尽早回滚
func UpdateCreditCardsStruct(ctx context.Context, creditcardsstruct *structs.CreditCardsStruct) error {

	// creditcardsstruct对象指针或主键Id不能为空
	if creditcardsstruct == nil || creditcardsstruct.Id < 1 {
		return errors.New("creditcardsstruct对象指针或主键Id不能为空")
	}

	//匿名函数return的error如果不为nil,事务就会回滚
	_, errUpdateCreditCardsStruct := zorm.Transaction(ctx, func(ctx context.Context) (interface{}, error) {

		//事务下的业务代码开始
		_, errUpdateCreditCardsStruct := zorm.Update(ctx, creditcardsstruct)

		if errUpdateCreditCardsStruct != nil {
			return nil, errUpdateCreditCardsStruct
		}

		return nil, nil
		//事务下的业务代码结束

	})

	//记录错误
	if errUpdateCreditCardsStruct != nil {
		errUpdateCreditCardsStruct := fmt.Errorf("service.UpdateCreditCardsStruct错误:%w", errUpdateCreditCardsStruct)
		fmt.Println(errUpdateCreditCardsStruct)
		return errUpdateCreditCardsStruct
	}

	return nil
}

// UpdateNotZeroCreditCardsStruct 更新
// 如果入参ctx中没有dbConnection,使用defaultDao开启事务并最后提交
// 如果入参ctx有dbConnection且没有事务,调用dbConnection.begin()开启事务并最后提交
// 如果入参ctx有dbConnection且有事务,只使用不提交,有开启方提交事务
// 但是如果遇到错误或者异常,虽然不是事务的开启方,也会回滚事务,让事务尽早回滚
func UpdateNotZeroCreditCardsStruct(ctx context.Context, creditcardsstruct *structs.CreditCardsStruct) error {

	// creditcardsstruct对象指针或主键Id不能为空
	if creditcardsstruct == nil || creditcardsstruct.Id < 1 {
		return errors.New("creditcardsstruct对象指针或主键Id不能为空")
	}

	//匿名函数return的error如果不为nil,事务就会回滚
	_, errUpdateCreditCardsStruct := zorm.Transaction(ctx, func(ctx context.Context) (interface{}, error) {

		//事务下的业务代码开始
		_, errUpdateCreditCardsStruct := zorm.UpdateNotZeroValue(ctx, creditcardsstruct)

		if errUpdateCreditCardsStruct != nil {
			return nil, errUpdateCreditCardsStruct
		}

		return nil, nil
		//事务下的业务代码结束

	})

	//记录错误
	if errUpdateCreditCardsStruct != nil {
		errUpdateCreditCardsStruct := fmt.Errorf("service.UpdateNotZeroCreditCardsStruct错误:%w", errUpdateCreditCardsStruct)
		fmt.Println(errUpdateCreditCardsStruct)
		return errUpdateCreditCardsStruct
	}

	return nil
}

// DeleteCreditCardsStructById 根据Id删除
// 如果入参ctx中没有dbConnection,使用defaultDao开启事务并最后提交
// 如果入参ctx有dbConnection且没有事务,调用dbConnection.begin()开启事务并最后提交
// 如果入参ctx有dbConnection且有事务,只使用不提交,有开启方提交事务
// 但是如果遇到错误或者异常,虽然不是事务的开启方,也会回滚事务,让事务尽早回滚
func DeleteCreditCardsStructById(ctx context.Context, id string) error {

	//id不能为空
	if len(id) < 1 {
		return errors.New("id不能为空")
	}

	//匿名函数return的error如果不为nil,事务就会回滚
	_, errDeleteCreditCardsStruct := zorm.Transaction(ctx, func(ctx context.Context) (interface{}, error) {

		//事务下的业务代码开始
		finder := zorm.NewDeleteFinder(structs.CreditCardsStructTableName).Append(" WHERE id=?", id)
		_, errDeleteCreditCardsStruct := zorm.UpdateFinder(ctx, finder)

		if errDeleteCreditCardsStruct != nil {
			return nil, errDeleteCreditCardsStruct
		}

		return nil, nil
		//事务下的业务代码结束

	})

	//记录错误
	if errDeleteCreditCardsStruct != nil {
		errDeleteCreditCardsStruct := fmt.Errorf("service.DeleteCreditCardsStruct错误:%w", errDeleteCreditCardsStruct)
		fmt.Println(errDeleteCreditCardsStruct)
		return errDeleteCreditCardsStruct
	}

	return nil
}

// FindCreditCardsStructById 根据Id查询信息
// ctx中如果没有dbConnection,则会使用默认的datasource进行无事务查询
func FindCreditCardsStructById(ctx context.Context, id string) (*structs.CreditCardsStruct, error) {
	//id不能为空
	if len(id) < 1 {
		return nil, errors.New("id不能为空")
	}

	//根据Id查询
	finder := zorm.NewSelectFinder(structs.CreditCardsStructTableName).Append(" WHERE id=?", id)
	creditcardsstruct := structs.CreditCardsStruct{}
	has, errFindCreditCardsStructById := zorm.QueryRow(ctx, finder, &creditcardsstruct)

	//记录错误
	if errFindCreditCardsStructById != nil {
		errFindCreditCardsStructById := fmt.Errorf("service.FindCreditCardsStructById错误:%w", errFindCreditCardsStructById)
		fmt.Println(errFindCreditCardsStructById)
		return nil, errFindCreditCardsStructById
	}

	if !has {
		return nil, nil
	}

	return &creditcardsstruct, nil

}

// FindCreditCardsStructList 根据Finder查询列表
// ctx中如果没有dbConnection,则会使用默认的datasource进行无事务查询
func FindCreditCardsStructList(ctx context.Context, finder *zorm.Finder, page *zorm.Page) ([]structs.CreditCardsStruct, error) {

	//finder不能为空
	if finder == nil {
		return nil, errors.New("finder不能为空")
	}

	creditcardsstructList := make([]structs.CreditCardsStruct, 0)
	errFindCreditCardsStructList := zorm.Query(ctx, finder, &creditcardsstructList, page)

	//记录错误
	if errFindCreditCardsStructList != nil {
		errFindCreditCardsStructList := fmt.Errorf("service.FindCreditCardsStructList错误:%w", errFindCreditCardsStructList)
		fmt.Println(errFindCreditCardsStructList)
		return nil, errFindCreditCardsStructList
	}

	return creditcardsstructList, nil
}
